ํ๋ฆฌ์ปค๋ฐ ํ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง์ ํฅ์์ํค์ธ์. ๋ ๊นจ๋ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ํ๋ก์ ํธ๋ฅผ ์ํด ์ฝ๋ ํ์ง ๊ฒ์ดํธ๋ฅผ ๊ตฌ์ฑํ๊ณ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๊ฒ์ดํธ: ํ๋ฆฌ์ปค๋ฐ ํ ๊ตฌ์ฑ ๋ง์คํฐํ๊ธฐ
๋์์์ด ์งํํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ์ธ๊ณ์์ ๋์ ์ฝ๋ ํ์ง์ ์ ์งํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊นจ๋ํ๊ณ , ํ์์ด ์ ๊ฐ์ถฐ์ ธ ์์ผ๋ฉฐ, ๋ฒ๊ทธ๊ฐ ์๋ ์ฝ๋๋ ์ ์ง๋ณด์ ๋น์ฉ์ ์ค์ผ ๋ฟ๋ง ์๋๋ผ ํ์ ์ ์ด์งํ๊ณ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ํํฉ๋๋ค. ์ฝ๋ ํ์ง์ ๊ฐ์ ํ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ค ํ๋๋ ํ๋ฆฌ์ปค๋ฐ ํ ์ ์ฌ์ฉํ ์ฝ๋ ํ์ง ๊ฒ์ดํธ์ ๊ตฌํ์ ๋๋ค. ์ด ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ๋ฅผ ์ํ ํ๋ฆฌ์ปค๋ฐ ํ ๊ตฌ์ฑ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํ์ฌ, ์ฝ๋๊ฐ ์ ์ฅ์์ ๋๋ฌํ๊ธฐ ์ ์ ์ฝ๋ ํ์ง ๊ฒ์ฌ๋ฅผ ์๋ํํ ์ ์๋๋ก ํฉ๋๋ค.
ํ๋ฆฌ์ปค๋ฐ ํ ์ด๋ ๋ฌด์์ธ๊ฐ์?
Git ํ ์ commit, push, receive์ ๊ฐ์ ์ด๋ฒคํธ ์ ํ์ Git์ด ์คํํ๋ ์คํฌ๋ฆฝํธ์ ๋๋ค. ํ๋ฆฌ์ปค๋ฐ ํ ์, ํนํ, ์ปค๋ฐ์ด ํ์ ๋๊ธฐ ์ ์ ์คํ๋ฉ๋๋ค. ์ด๋ ์ปค๋ฐ๋๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒ์ฌํ๊ณ ๋ฏธ๋ฆฌ ์ ์๋ ํ์ง ๊ธฐ์ค์ ์ถฉ์กฑํ์ง ์๋ ์ปค๋ฐ์ ๋ฐฉ์งํ ์ ์๋ ์ค์ํ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฎ์ ํ์ง์ ์ฝ๋๊ฐ ์ฝ๋๋ฒ ์ด์ค์ ๋ค์ด์ค๋ ๊ฒ์ ๋ง๋ ๋ฌธ์ง๊ธฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง์ ์ํด ํ๋ฆฌ์ปค๋ฐ ํ ์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
- ์กฐ๊ธฐ ์ค๋ฅ ๊ฐ์ง: ํ๋ฆฌ์ปค๋ฐ ํ ์ ๊ฐ๋ฐ ๊ณผ์ ์ด๊ธฐ์ ์ฝ๋ ํ์ง ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ฌ ๋ ์ด์ ์ ํ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ ์ฝ๋ ๋ฆฌ๋ทฐ ์ค์ด๋, ๋ ์ฌํ๊ฒ๋ ํ๋ก๋์ ํ๊ฒฝ์์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ ๋๋ค.
- ์๋ํ๋ ์ฝ๋ ํฌ๋งคํ : ํ๊ณผ ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด๋ ์ฝ๋ ์คํ์ผ์ ๋ณด์ฅํฉ๋๋ค. ์๋ ํฌ๋งคํ ์ ์คํ์ผ ๊ด๋ จ ๋ ผ์์ ๋ฐฉ์งํ๊ณ ๋ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฒ ์ด์ค์ ๊ธฐ์ฌํฉ๋๋ค.
- ์ฝ๋ ๋ฆฌ๋ทฐ ๋ถ๋ด ๊ฐ์: ์ฝ๋ฉ ํ์ค์ ์๋์ผ๋ก ๊ฐ์ ํจ์ผ๋ก์จ ํ๋ฆฌ์ปค๋ฐ ํ ์ ์ฝ๋ ๋ฆฌ๋ทฐ์ด์ ๋ถ๋ด์ ์ค์ฌ์ฃผ์ด, ๊ทธ๋ค์ด ์ํคํ ์ฒ ๊ฒฐ์ ๊ณผ ๋ณต์กํ ๋ก์ง์ ์ง์คํ ์ ์๊ฒ ํฉ๋๋ค.
- ์ฝ๋ ์ ์ง๋ณด์์ฑ ํฅ์: ์ผ๊ด๋๊ณ ๊ณ ํ์ง์ธ ์ฝ๋๋ฒ ์ด์ค๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ ์ง๋ณด์ํ๊ณ ๋ฐ์ ์ํค๊ธฐ ๋ ์ฝ์ต๋๋ค.
- ์ผ๊ด์ฑ ๊ฐ์ : ๋๊ฐ ์์ฑํ๋์ง์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฝ๋๊ฐ ํ๋ก์ ํธ ํ์ค์ ์ค์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๊ฐ์ธ์ ์ฝ๋ฉ ์คํ์ผ์ด ๋ค๋ฅผ ์ ์๋ ๋ฐ๋, ๋์ฟ, ๋ถ์๋ ธ์ค์์ด๋ ์ค์ ๊ฐ์ด ์๋ก ๋ค๋ฅธ ์์น์์ ๊ทผ๋ฌดํ๋ ๋ถ์ฐ๋ ํ์์ ํนํ ์ค์ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง์ ์ํ ์ฃผ์ ๋๊ตฌ
ํ๋ฆฌ์ปค๋ฐ ํ ๊ณผ ํจ๊ป ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๊ฒ์ฌ๋ฅผ ์๋ํํ๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ช ๊ฐ์ง ๋๊ตฌ๊ฐ ์์ต๋๋ค:
- ESLint: ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์๋ณํ๊ณ , ์ฝ๋ฉ ์คํ์ผ์ ๊ฐ์ ํ๋ฉฐ, ์ฝ๋ ๊ฐ๋ ์ฑ์ ํฅ์์ํค๋ ๋ฐ ๋์์ ์ฃผ๋ ๊ฐ๋ ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฆฐํฐ์ ๋๋ค. ๊ด๋ฒ์ํ ๊ท์น์ ์ง์ํ๋ฉฐ ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค.
- Prettier: ์ผ๊ด๋ ์คํ์ผ์ ๋ง์ถฐ ์ฝ๋๋ฅผ ์๋์ผ๋ก ํฌ๋งคํ ํ๋ ๋ ์์ ์ธ(opinionated) ์ฝ๋ ํฌ๋งคํฐ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ, ํ์ ์คํฌ๋ฆฝํธ, JSX ๋ฐ ๊ธฐํ ์ฌ๋ฌ ์ธ์ด๋ฅผ ์ง์ํฉ๋๋ค.
- Husky: Git ํ ์ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ์ ๋๋ค. Git ์ํฌํ๋ก์ฐ์ ์ฌ๋ฌ ๋จ๊ณ์์ ์คํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
- lint-staged: ์คํ ์ด์ง๋ ํ์ผ์ ๋ํด์๋ง ๋ฆฐํฐ์ ํฌ๋งคํฐ๋ฅผ ์คํํ์ฌ ํ๋ฆฌ์ปค๋ฐ ํ๋ก์ธ์ค์ ์๋๋ฅผ ํฌ๊ฒ ํฅ์์ํค๋ ๋๊ตฌ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ณ๊ฒฝ๋์ง ์์ ํ์ผ์ ๋ํ ๋ถํ์ํ ๊ฒ์ฌ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
ํ๋ฆฌ์ปค๋ฐ ํ ๊ตฌ์ฑํ๊ธฐ: ๋จ๊ณ๋ณ ๊ฐ์ด๋
Husky์ lint-staged๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์ ํ๋ฆฌ์ปค๋ฐ ํ ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๊ฐ์ด๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1๋จ๊ณ: ์์กด์ฑ ์ค์น
๋จผ์ , npm ๋๋ yarn์ ์ฌ์ฉํ์ฌ ํ์ํ ํจํค์ง๋ฅผ ๊ฐ๋ฐ ์์กด์ฑ์ผ๋ก ์ค์นํฉ๋๋ค:
npm install --save-dev husky lint-staged eslint prettier
๋๋ yarn ์ฌ์ฉ ์:
yarn add --dev husky lint-staged eslint prettier
2๋จ๊ณ: Husky ์ด๊ธฐํ
Husky๋ Git ํ ๊ด๋ฆฌ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํฉ๋๋ค. ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์ด๊ธฐํํ์ธ์:
npx husky install
์ด๋ ๊ฒ ํ๋ฉด ํ๋ก์ ํธ์ `.husky` ๋๋ ํ ๋ฆฌ๊ฐ ์์ฑ๋๋ฉฐ, ์ฌ๊ธฐ์ Git ํ ์ด ์ ์ฅ๋ฉ๋๋ค.
3๋จ๊ณ: ํ๋ฆฌ์ปค๋ฐ ํ ๊ตฌ์ฑ
Husky๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฆฌ์ปค๋ฐ ํ ์ ์ถ๊ฐํฉ๋๋ค:
npx husky add .husky/pre-commit "npx lint-staged"
์ด ๋ช ๋ น์ `.husky` ๋๋ ํ ๋ฆฌ์ `pre-commit` ํ์ผ์ ์์ฑํ๊ณ ์ฌ๊ธฐ์ `npx lint-staged` ๋ช ๋ น์ ์ถ๊ฐํฉ๋๋ค. ์ด๋ Git์๊ฒ ๊ฐ ์ปค๋ฐ ์ ์ lint-staged๋ฅผ ์คํํ๋๋ก ์ง์ํฉ๋๋ค.
4๋จ๊ณ: lint-staged ๊ตฌ์ฑ
lint-staged๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ ์ด์ง๋ ํ์ผ์ ๋ํด์๋ง ๋ฆฐํฐ์ ํฌ๋งคํฐ๋ฅผ ์คํํ ์ ์์ด ํ๋ฆฌ์ปค๋ฐ ํ๋ก์ธ์ค์ ์๋๋ฅผ ํฌ๊ฒ ๋์ผ ์ ์์ต๋๋ค. ํ๋ก์ ํธ ๋ฃจํธ์ `lint-staged.config.js`(๋๋ ES ๋ชจ๋์ ๊ฒฝ์ฐ `lint-staged.config.mjs`) ํ์ผ์ ๋ง๋ค๊ณ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑํฉ๋๋ค:
module.exports = {
'*.{js,jsx,ts,tsx}': ['eslint --fix', 'prettier --write'],
};
์ด ๊ตฌ์ฑ์ lint-staged์๊ฒ ์คํ ์ด์ง๋ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ ํ์ ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ํด ESLint์ Prettier๋ฅผ ์คํํ๋๋ก ์ง์ํฉ๋๋ค. ESLint์ `--fix` ํ๋๊ทธ๋ ์๋์ผ๋ก ์์ ํ ์ ์๋ ๋ชจ๋ ๋ฆฐํ ์ค๋ฅ๋ฅผ ์์ ํ๊ณ , Prettier์ `--write` ํ๋๊ทธ๋ ํ์ผ์ ํฌ๋งคํ ํ๊ณ ํฌ๋งคํ ๋ ์ฝ๋๋ก ๋ฎ์ด์๋๋ค.
๋๋ `package.json` ํ์ผ์ ์ง์ ๊ตฌ์ฑ์ ์ ์ํ ์๋ ์์ต๋๋ค:
{
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix",
"prettier --write"
]
}
}
5๋จ๊ณ: ESLint ๊ตฌ์ฑ
์์ง ํ๋ก์ ํธ์ ESLint๋ฅผ ๊ตฌ์ฑํ์ง ์์๋ค๋ฉด ๊ตฌ์ฑํ์ธ์. ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ESLint ๊ตฌ์ฑ ํ์ผ์ ์์ฑํ ์ ์์ต๋๋ค:
npx eslint --init
์ด ๋ช ๋ น์ ํ๋ก์ ํธ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ESLint ๊ตฌ์ฑ ํ์ผ(`.eslintrc.js`, `.eslintrc.json` ๋๋ `.eslintrc.yml`)์ ๋ง๋๋ ๊ณผ์ ์ ์๋ดํฉ๋๋ค. ๋ค์ํ ์ฌ์ ์ ์๋ ๊ตฌ์ฑ ์ค์์ ์ ํํ๊ฑฐ๋ ์์ ๋ง์ ์ฌ์ฉ์ ์ง์ ๊ท์น์ ๋ง๋ค ์ ์์ต๋๋ค.
์์ `.eslintrc.js`:
module.exports = {
env: {
browser: true,
es2021: true,
node: true
},
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:@typescript-eslint/recommended',
'prettier'
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaFeatures: {
jsx: true
},
ecmaVersion: 12,
sourceType: 'module'
},
plugins: [
'react',
'@typescript-eslint'
],
rules: {
'no-unused-vars': 'warn',
'react/prop-types': 'off'
}
};
์ด ๊ตฌ์ฑ์ ๊ถ์ฅ ESLint ๊ท์น, ๊ถ์ฅ React ๊ท์น, ๊ถ์ฅ TypeScript ๊ท์น์ ํ์ฅํ๊ณ Prettier์ ํตํฉํฉ๋๋ค. ๋ํ `react/prop-types` ๊ท์น์ ๋นํ์ฑํํ๊ณ `no-unused-vars` ๊ท์น์ ๊ฒฝ๊ณ ๋ก ์ค์ ํฉ๋๋ค.
6๋จ๊ณ: Prettier ๊ตฌ์ฑ
ํ๋ก์ ํธ ๋ฃจํธ์ `.prettierrc.js`(๋๋ `.prettierrc.json`, `.prettierrc.yml`, `.prettierrc.toml`) ํ์ผ์ ๋ง๋ค์ด Prettier๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ํ๋ก์ ํธ์ ์คํ์ผ ๊ฐ์ด๋๋ผ์ธ์ ๋ง๊ฒ Prettier์ ํฌ๋งคํ ์ต์ ์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
์์ `.prettierrc.js`:
module.exports = {
semi: false,
trailingComma: 'all',
singleQuote: true,
printWidth: 120,
tabWidth: 2
};
์ด ๊ตฌ์ฑ์ Prettier๊ฐ ์์๋ฐ์ดํ๋ฅผ ์ฌ์ฉํ๊ณ , ์ธ๋ฏธ์ฝ๋ก ์ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ, ํํ ์ผํ๋ฅผ ์ฌ์ฉํ๊ณ , ์ถ๋ ฅ ๋๋น๋ฅผ 120์๋ก, ํญ ๋๋น๋ฅผ 2์นธ์ผ๋ก ์ค์ ํ๋๋ก ํฉ๋๋ค.
๋๋ `package.json` ๋ด๋ถ์ Prettier ๊ตฌ์ฑ์ ์ ์ํ ์ ์์ต๋๋ค:
{
"prettier": {
"semi": false,
"trailingComma": "all",
"singleQuote": true,
"printWidth": 120,
"tabWidth": 2
}
}
7๋จ๊ณ: ๊ตฌ์ฑ ํ ์คํธํ๊ธฐ
๊ตฌ์ฑ์ ํ ์คํธํ๋ ค๋ฉด ๋ช ๊ฐ์ง ๋ณ๊ฒฝ ์ฌํญ์ ์คํ ์ด์งํ๊ณ ์ปค๋ฐ์ ์๋ํด ๋ณด์ธ์. ์๋ฅผ ๋ค์ด:
git add .
git commit -m "Test pre-commit hook"
๋ฆฐํ ์ด๋ ํฌ๋งคํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ, ESLint์ Prettier๊ฐ ์๋์ผ๋ก ์์ ํ๊ฑฐ๋(๊ฐ๋ฅํ ๊ฒฝ์ฐ) ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค. ์ค๋ฅ๊ฐ ๋ณด๊ณ ๋๋ฉด ์ปค๋ฐ์ด ์ค๋จ๋๋ฏ๋ก, ๋ค์ ์ปค๋ฐํ๊ธฐ ์ ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ณ ๊ธ ๊ตฌ์ฑ ์ต์
๋ค๋ฅธ ๋ฆฐํฐ ๋ฐ ํฌ๋งคํฐ ์ฌ์ฉํ๊ธฐ
๋ค๋ฅธ ๋ฆฐํฐ์ ํฌ๋งคํฐ๋ฅผ ํ๋ฆฌ์ปค๋ฐ ํ ๊ตฌ์ฑ์ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, CSS ๋๋ SASS ํ์ผ ๋ฆฐํ ์ Stylelint๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
npm install --save-dev stylelint stylelint-config-standard
๊ทธ๋ฐ ๋ค์, Stylelint๋ฅผ ํฌํจํ๋๋ก `lint-staged.config.js` ํ์ผ์ ์ ๋ฐ์ดํธํฉ๋๋ค:
module.exports = {
'*.{js,jsx,ts,tsx}': ['eslint --fix', 'prettier --write'],
'*.{css,scss}': ['stylelint --fix'],
};
์ปค๋ฐ ์ ํ ์คํธ ์คํํ๊ธฐ
ํ๋ฆฌ์ปค๋ฐ ํ ์ ์ผ๋ถ๋ก ๋จ์ ํ ์คํธ๋ฅผ ์คํํ ์๋ ์์ต๋๋ค. ์ด๋ ์ฝ๋๊ฐ ์ปค๋ฐ๋๊ธฐ ์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Jest๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค:
npm install --save-dev jest
ํ ์คํธ ๋ช ๋ น์ ํฌํจํ๋๋ก `lint-staged.config.js` ํ์ผ์ ์ ๋ฐ์ดํธํฉ๋๋ค:
module.exports = {
'*.{js,jsx,ts,tsx}': ['eslint --fix', 'prettier --write', 'jest --findRelatedTests'],
'*.{css,scss}': ['stylelint --fix'],
};
`--findRelatedTests` ํ๋๊ทธ๋ Jest์๊ฒ ๋ณ๊ฒฝ๋ ํ์ผ๊ณผ ๊ด๋ จ๋ ํ ์คํธ๋ง ์คํํ๋๋ก ์ง์ํ์ฌ ํ๋ก์ธ์ค ์๋๋ฅผ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
ํ๋ฆฌ์ปค๋ฐ ํ ๊ฑด๋๋ฐ๊ธฐ
๊ฒฝ์ฐ์ ๋ฐ๋ผ ํ๋ฆฌ์ปค๋ฐ ํ ์ ์ผ์์ ์ผ๋ก ๊ฑด๋๋ฐ๊ณ ์ถ์ ์ ์์ต๋๋ค. `git commit` ๋ช ๋ น๊ณผ ํจ๊ป `--no-verify` ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค:
git commit --no-verify -m "Commit message"
๊ทธ๋ฌ๋ ํ ์ ์ฝ๋ ํ์ง์ ์ ์งํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ๋ฏ๋ก ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ๊ฑด๋๋ฐ์ง ์๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ฌธ์ ํด๊ฒฐ
- ํ ์ด ์คํ๋์ง ์์: Husky๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์น ๋ฐ ์ด๊ธฐํ๋์๋์ง, ๊ทธ๋ฆฌ๊ณ ํ๋ก์ ํธ ๋ฃจํธ์ `.husky` ๋๋ ํ ๋ฆฌ๊ฐ ์๋์ง ํ์ธํ์ธ์. ๋ํ `.husky` ๋๋ ํ ๋ฆฌ์ `pre-commit` ํ์ผ์ด ์คํ ๊ฐ๋ฅํ์ง ํ์ธํ์ธ์.
- ๋ฆฐํ ์ค๋ฅ๊ฐ ์์ ๋์ง ์์: ESLint์ `--fix` ํ๋๊ทธ๊ฐ ์ฌ์ฉ๋์๋์ง, ๊ทธ๋ฆฌ๊ณ ESLint ๊ตฌ์ฑ์ด ํน์ ์ ํ์ ์ค๋ฅ๋ฅผ ์๋์ผ๋ก ์์ ํ๋๋ก ์ค์ ๋์ด ์๋์ง ํ์ธํ์ธ์.
- Prettier๊ฐ ํ์ผ์ ํฌ๋งคํ ํ์ง ์์: Prettier์ `--write` ํ๋๊ทธ๊ฐ ์ฌ์ฉ๋์๋์ง, ๊ทธ๋ฆฌ๊ณ Prettier ๊ตฌ์ฑ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ด ์๋์ง ํ์ธํ์ธ์.
- ๋๋ฆฐ ํ๋ฆฌ์ปค๋ฐ ํ : lint-staged๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ์ด์ง๋ ํ์ผ์ ๋ํด์๋ง ๋ฆฐํฐ์ ํฌ๋งคํฐ๋ฅผ ์คํํ์ธ์. ๋ํ ๊ฒ์ฌ๋๋ ๊ท์น ๋ฐ ์ค์ ์๋ฅผ ์ต์ํํ๋๋ก ESLint ๋ฐ Prettier ๊ตฌ์ฑ์ ์ต์ ํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- ์ถฉ๋ํ๋ ๊ตฌ์ฑ: ESLint์ Prettier ๊ตฌ์ฑ์ด ์๋ก ์ถฉ๋ํ์ง ์๋์ง ํ์ธํ์ธ์. ์ถฉ๋ํ๋ ๊ฒฝ์ฐ, ์ถฉ๋์ ํด๊ฒฐํ๊ธฐ ์ํด ํ๋ ๋๋ ๋ ๊ตฌ์ฑ์ ๋ชจ๋ ์กฐ์ ํด์ผ ํ ์ ์์ต๋๋ค. ์ถฉ๋์ ํผํ๊ธฐ ์ํด `eslint-config-prettier` ๋ฐ `eslint-plugin-prettier`์ ๊ฐ์ ๊ณต์ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
ํ๋ฆฌ์ปค๋ฐ ํ ๋ชจ๋ฒ ์ฌ๋ก
- ํ ์ ๋น ๋ฅด๊ฒ ์ ์งํ์ธ์: ๋๋ฆฐ ํ ์ ๊ฐ๋ฐ์ ์์ฐ์ฑ์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. lint-staged๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ์ด์ง๋ ํ์ผ๋ง ์ฒ๋ฆฌํ๊ณ ๋ฆฐํฐ ๋ฐ ํฌ๋งคํฐ ๊ตฌ์ฑ์ ์ต์ ํํ์ธ์.
- ๋ช ํํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ธ์: ํ ์ด ์คํจํ๋ฉด ๊ฐ๋ฐ์๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์๋ดํ ์ ์๋๋ก ๋ช ํํ๊ณ ์ ์ตํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ธ์.
- ๊ฐ๋ฅํ ํ ๋ง์ด ์๋ํํ์ธ์: ์ฝ๋ ํฌ๋งคํ ๊ณผ ๋ฆฐํ ์ ์๋ํํ์ฌ ์๋ ์์ ์ ์ต์ํํ๊ณ ์ผ๊ด์ฑ์ ๋ณด์ฅํ์ธ์.
- ํ์ ๊ต์กํ์ธ์: ๋ชจ๋ ํ์์ด ํ๋ฆฌ์ปค๋ฐ ํ ์ ๋ชฉ์ ๊ณผ ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋๋ก ํ์ธ์.
- ์ผ๊ด๋ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ธ์: ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ESLint, Prettier ๋ฐ ๊ธฐํ ๋๊ตฌ์ ๋ํ ์ผ๊ด๋ ๊ตฌ์ฑ์ ์ ์งํ์ธ์. ์ด๋ ๋ชจ๋ ์ฝ๋๊ฐ ๋์ผํ ๋ฐฉ์์ผ๋ก ํฌ๋งคํ ๋๊ณ ๋ฆฐํ ๋๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ฌ๋ฌ ํ๋ก์ ํธ์ ๊ฑธ์ณ ์ฝ๊ฒ ์ค์นํ๊ณ ์ ๋ฐ์ดํธํ ์ ์๋ ๊ณต์ ๊ตฌ์ฑ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- ํ ์ ํ ์คํธํ์ธ์: ํ๋ฆฌ์ปค๋ฐ ํ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์๊ธฐ์น ์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์๋์ง ํ์ธํ๊ธฐ ์ํด ์ ๊ธฐ์ ์ผ๋ก ํ ์คํธํ์ธ์.
์ ์ธ๊ณ์ ์ธ ๊ณ ๋ ค ์ฌํญ
์ ์ธ๊ณ์ ๋ถ์ฐ๋ ํ๊ณผ ํ๋ ฅํ ๋๋ ๋ค์ ์ฌํญ์ ๊ณ ๋ คํ์ธ์:
- ์ผ๊ด๋ ๋๊ตฌ ๋ฒ์ : ๋ชจ๋ ํ์์ด ๋์ผํ ๋ฒ์ ์ ESLint, Prettier, Husky, lint-staged๋ฅผ ์ฌ์ฉํ๋๋ก ํ์ธ์. ์ด๋ `package.json` ํ์ผ์ ๋ฒ์ ์ ๋ช ์ํ๊ณ npm์ด๋ yarn๊ณผ ๊ฐ์ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ฌ ์์กด์ฑ์ ์ค์นํจ์ผ๋ก์จ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
- ํฌ๋ก์ค ํ๋ซํผ ํธํ์ฑ: ํ๋ฆฌ์ปค๋ฐ ํ ์ด ๋ชจ๋ ํ๋ซํผ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ฌ๋ฌ ์ด์ ์ฒด์ (Windows, macOS, Linux)์์ ํ ์คํธํ์ธ์. ๊ฐ๋ฅํ๋ฉด ํฌ๋ก์ค ํ๋ซํผ ๋๊ตฌ์ ๋ช ๋ น์ ์ฌ์ฉํ์ธ์.
- ์๊ฐ๋ ์ฐจ์ด: ํ๋ฆฌ์ปค๋ฐ ํ ๋ฌธ์ ์ ๋ํด ํ์๋ค๊ณผ ์ํตํ ๋ ์๊ฐ๋ ์ฐจ์ด๋ฅผ ์ผ๋์ ๋์ธ์. ๊ทธ๋ค์ด ๋ฌธ์ ๋ฅผ ์ ์ํ๊ฒ ํด๊ฒฐํ ์ ์๋๋ก ๋ช ํํ ์ง์นจ๊ณผ ์์๋ฅผ ์ ๊ณตํ์ธ์.
- ์ธ์ด ์ง์: ํ๋ก์ ํธ๊ฐ ์ฌ๋ฌ ์ธ์ด๋ฅผ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ, ํ๋ฆฌ์ปค๋ฐ ํ ์ด ํ๋ก์ ํธ์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์ธ์ด๋ฅผ ์ง์ํ๋์ง ํ์ธํ์ธ์. ๊ฐ ์ธ์ด์ ๋ํด ์ถ๊ฐ์ ์ธ ๋ฆฐํฐ์ ํฌ๋งคํฐ๋ฅผ ์ค์นํด์ผ ํ ์๋ ์์ต๋๋ค.
๊ฒฐ๋ก
ํ๋ฆฌ์ปค๋ฐ ํ ์ ๊ตฌํํ๋ ๊ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์์ ์ฝ๋ ํ์ง์ ๊ฐ์ ํ๊ณ , ํ ํ์ ์ ๊ฐ์ ํ๋ฉฐ, ์ ์ง๋ณด์ ๋น์ฉ์ ์ค์ด๋ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค. ESLint, Prettier, Husky, lint-staged์ ๊ฐ์ ๋๊ตฌ๋ฅผ ํตํฉํจ์ผ๋ก์จ ์ฝ๋ ํฌ๋งคํ , ๋ฆฐํ , ํ ์คํธ๋ฅผ ์๋ํํ์ฌ ๊ณ ํ์ง ์ฝ๋๋ง์ด ์ ์ฅ์์ ์ปค๋ฐ๋๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋์ ์ค๋ช ๋ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๋ฉด, ๋ ๊นจ๋ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ ์ ๋ขฐํ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋์์ด ๋ ๊ฐ๋ ฅํ ์ฝ๋ ํ์ง ๊ฒ์ดํธ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. ์ด ๊ดํ์ ๋ฐ์๋ค์ด๊ณ ์ค๋ ์ฌ๋ฌ๋ถ ํ์ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ํ ๋จ๊ณ ๋์ด์ฌ๋ฆฌ์ธ์.